public class HammingDistance {
    public int hammingDistance1(int x, int y) {
        // 异或运算后, k 中的 1 个数就是 x 与 y 对应位不同的个数
        int k = x ^ y;
        int ret = 0;
        while(k != 0) {
            // 不断将 1 向最低位移动, 移动到最低位后 &1 其结果为 1
            // 即数出 k 二进制表示中 1 的个数
            ret += k & 1;
            k >>= 1;
        }
        return ret;
    }

    public int hammingDistance2(int x, int y) {
        // 异或运算后, k 中的 1 个数就是 x 与 y 对应位不同的个数
        int k = x ^ y;
        int ret = 0;
        while(k != 0) {
            // 将 k 的最右侧 1 变成 0, 操作的次数就是 1 的个数
            k &= k-1;
            ret++;
        }
        return ret;
    }

    public int lowbit(int x) {
        return x & -x;
    }

    public int hammingDistance(int x, int y) {
        // 异或运算后, k 中的 1 个数就是 x 与 y 对应位不同的个数
        int k = x ^ y;
        int ret = 0;
        while(k > 0) {
            k -= lowbit(k);
            ret++;
        }
        return ret;
    }
}
